DET = "DET"
# 主语
SUBJ = "SUBJ"
# 指称词（专名）
DENO = "DENO"
ADJ = "ADJ"
PRED = "PRED"
PRED0 = "PRED0"
PRED1 = "PRED1"
PRED2 = "PRED2"
PRED3 = "PRED3"
ADV = "ADV"

AN = 'AN'
DN = 'DN'
VN = 'VN'
VA = 'VA'
S = 'S'
VT = 'VT'
VI = 'VI'
VC = 'VC'
CA = 'CA'
OBJ = 'OBJ'
END = '$'


class ParserTable:
    def __init__(self):
        self.rule = {
            '1': ['ADJ', ['ADJ', 'ADJ']],
            '2': ['ADV', ['ADV', 'ADV']],
            '3': ['AN', ['ADJ', 'SUBJ']],
            '4': ['DN', ['DET', 'AN']],
            '5': ['DN', ['DET', 'SUBJ']],
            '6': ['AN', ['ADJ', 'OBJ']],
            '7': ['DN', ['DET', 'OBJ']],
            '8': ['VN', ['VT', 'DN']],
            '9': ['VN', ['VT', 'AN']],
            '10': ['VN', ['VT', 'OBJ']],
            '11': ['VN', ['VN', 'DN']],
            '12': ['VN', ['VN', 'AN']],
            '13': ['VN', ['VN', 'OBJ']],
            '14': ['VN', ['VN', 'ADV']],
            '15': ['S', ['DN', 'VA']],
            '16': ['S', ['DN', 'VN']],
            '17': ['S', ['AN', 'VA']],
            '18': ['S', ['AN', 'VN']],
            '19': ['S', ['SUBJ', 'VA']],
            '20': ['S', ['SUBJ', 'VN']],
            '21': ['VA', ['VI', 'ADV']],
            '22': ['S', ['DN', 'VI']],
            '23': ['S', ['AN', 'VI']],
            '24': ['S', ['SUBJ', 'VI']],
            '25': ['CA', ['VC', 'ADJ']],
            '26': ['S', ['DN', 'CA']],
            '27': ['S', ['AN', 'CA']],
            '28': ['S', ['SUBJ', 'CA']],
        }  # 定义语法规则
        self.action = {
              '0': {'DET': 's2', 'ADJ': 's3', 'SUBJ': 's18', 'VT': None, 'VI': None, 'VC': None, 'OBJ': None, 'ADV': None,
                  '$': None},
              '1': {'DET': None, 'ADJ': None, 'SUBJ': None, 'VT': None, 'VI': None, 'VC': None, 'OBJ': None, 'ADV': None,
                  '$': 'acc'},
              '2': {'DET': None, 'ADJ': 's3', 'SUBJ': 's25', 'VT': None, 'VI': None, 'VC': None, 'OBJ': None, 'ADV': None,
                  '$': None},
              '3': {'DET': None, 'ADJ': 's35', 'SUBJ': 's4', 'VT': None, 'VI': None, 'VC': None, 'OBJ': None, 'ADV': None,
                  '$': None},
              '4': {'DET': None, 'ADJ': None, 'SUBJ': None, 'VT': 'r3', 'VI': 'r3', 'VC': 'r3', 'OBJ': None, 'ADV': None,
                  '$': None},
              '5': {'DET': None, 'ADJ': None, 'SUBJ': None, 'VT': 'r4', 'VI': 'r4', 'VC': 'r4', 'OBJ': None, 'ADV': None,
                  '$': None},
              '6': {'DET': None, 'ADJ': None, 'SUBJ': None, 'VT': 's7', 'VI': 's7', 'VC': 's30', 'OBJ': None, 'ADV': None,
                  '$': None},
              '7': {'DET': 's8', 'ADJ': 's9', 'SUBJ': None, 'VT': None, 'VI': None, 'VC': None, 'OBJ': 's23', 'ADV': 's26',
                  '$': 'r22'},
              '8': {'DET': None, 'ADJ': 's9', 'SUBJ': None, 'VT': None, 'VI': None, 'VC': None, 'OBJ': 's21', 'ADV': None,
                  '$': None},
              '9': {'DET': None, 'ADJ': 's35', 'SUBJ': None, 'VT': None, 'VI': None, 'VC': None, 'OBJ': 's10', 'ADV': None,
                  '$': None},
              '10': {'DET': None, 'ADJ': None, 'SUBJ': None, 'VT': None, 'VI': None, 'VC': None, 'OBJ': None, 'ADV': 'r6',
                   '$': 'r6'},
              '11': {'DET': None, 'ADJ': None, 'SUBJ': None, 'VT': None, 'VI': None, 'VC': None, 'OBJ': None, 'ADV': 'r4',
                   '$': 'r4'},
              '12': {'DET': None, 'ADJ': None, 'SUBJ': None, 'VT': None, 'VI': None, 'VC': None, 'OBJ': None, 'ADV': 'r8',
                   '$': 'r8'},
              '13': {'DET': None, 'ADJ': None, 'SUBJ': None, 'VT': None, 'VI': None, 'VC': None, 'OBJ': None,
                   'ADV': 's14',
                   '$': 'r16'},
              '14': {'DET': None, 'ADJ': None, 'SUBJ': None, 'VT': None, 'VI': None, 'VC': None, 'OBJ': None, 'ADV': 's36',
                   '$': 'r14'},
              '15': {'DET': None, 'ADJ': None, 'SUBJ': None, 'VT': None, 'VI': None, 'VC': None, 'OBJ': None, 'ADV': None,
                   '$': 'r15'},
              '16': {'DET': None, 'ADJ': None, 'SUBJ': None, 'VT': 's7', 'VI': 's27', 'VC': 's30', 'OBJ': None, 'ADV': None,
                   '$': None},
              '17': {'DET': None, 'ADJ': None, 'SUBJ': None, 'VT': None, 'VI': None, 'VC': None, 'OBJ': None,
                   'ADV': 's14',
                   '$': 'r17'},
              '18': {'DET': None, 'ADJ': None, 'SUBJ': None, 'VT': 's7', 'VI': 's28', 'VC': 's30', 'OBJ': None, 'ADV': None,
                   '$': None},
              '19': {'DET': None, 'ADJ': None, 'SUBJ': None, 'VT': None, 'VI': None, 'VC': None, 'OBJ': None,
                   'ADV': 's14',
                   '$': 'r20'},
              '20': {'DET': None, 'ADJ': None, 'SUBJ': None, 'VT': None, 'VI': None, 'VC': None, 'OBJ': None, 'ADV': None,
                   '$': 'r19'},
              '21': {'DET': None, 'ADJ': None, 'SUBJ': None, 'VT': None, 'VI': None, 'VC': None, 'OBJ': None, 'ADV': 'r7',
                   '$': 'r7'},
              '22': {'DET': None, 'ADJ': None, 'SUBJ': None, 'VT': None, 'VI': None, 'VC': None, 'OBJ': None, 'ADV': 'r9',
                   '$': 'r9'},
              '23': {'DET': None, 'ADJ': None, 'SUBJ': None, 'VT': None, 'VI': None, 'VC': None, 'OBJ': None,
                   'ADV': 'r10',
                   '$': 'r10'},
              '24': {'DET': None, 'ADJ': None, 'SUBJ': None, 'VT': None, 'VI': None, 'VC': None, 'OBJ': None,
                   'ADV': 's14',
                   '$': 'r18'},
              '25': {'DET': None, 'ADJ': None, 'SUBJ': None, 'VT': 'r5', 'VI': 'r5', 'VC': 'r5', 'OBJ': None, 'ADV': None,
                   '$': None},
              '26': {'DET': None, 'ADJ': None, 'SUBJ': None, 'VT': None, 'VI': None, 'VC': None, 'OBJ': None, 'ADV': 's36',
                   '$': 'r21'},
              '27': {'DET': None, 'ADJ': None, 'SUBJ': None, 'VT': None, 'VI': None, 'VC': None, 'OBJ': None, 'ADV': 's26',
                   '$': 'r23'},
              '28': {'DET': None, 'ADJ': None, 'SUBJ': None, 'VT': None, 'VI': None, 'VC': None, 'OBJ': None, 'ADV': 's26',
                   '$': 'r24'},
              '29': {'DET': None, 'ADJ': None, 'SUBJ': None, 'VT': None, 'VI': None, 'VC': None, 'OBJ': None, 'ADV': None,
                   '$': 'r19'},
              '30': {'DET': None, 'ADJ': 's31', 'SUBJ': None, 'VT': None, 'VI': None, 'VC': None, 'OBJ': None, 'ADV': None,
                   '$': None},
              '31': {'DET': None, 'ADJ': 's37', 'SUBJ': None, 'VT': None, 'VI': None, 'VC': None, 'OBJ': None, 'ADV': None,
                   '$': 'r25'},
              '32': {'DET': None, 'ADJ': None, 'SUBJ': None, 'VT': None, 'VI': None, 'VC': None, 'OBJ': None, 'ADV': None,
                   '$': 'r26'},
              '33': {'DET': None, 'ADJ': None, 'SUBJ': None, 'VT': None, 'VI': None, 'VC': None, 'OBJ': None, 'ADV': None,
                   '$': 'r27'},
              '34': {'DET': None, 'ADJ': None, 'SUBJ': None, 'VT': None, 'VI': None, 'VC': None, 'OBJ': None, 'ADV': None,
                   '$': 'r28'},
              '35': {'DET': None, 'ADJ': 'r1', 'SUBJ': 'r1', 'VT': None, 'VI': None, 'VC': None, 'OBJ': 'r1', 'ADV': None,
                   '$': None},
              '36': {'DET': None, 'ADJ': None, 'SUBJ': None, 'VT': None, 'VI': None, 'VC': None, 'OBJ': None, 'ADV': 'r2',
                   '$': 'r2'},
              '37': {'DET': None, 'ADJ': 'r1', 'SUBJ': None, 'VT': None, 'VI': None, 'VC': None, 'OBJ': None, 'ADV': None,
                   '$': 'r1'},
        }  # 定义action
        self.goto = {
            '0': {'S': '1', 'AN': '16', 'DN': '6', 'VN': None, 'VA': None,'CA':None,'ADJ':'3','ADV':None},
            '1': {'S': None, 'AN': None, 'DN': None, 'VN': None, 'VA': None,'CA':None,'ADJ':None,'ADV':None},
            '2': {'S': None, 'AN': '5', 'DN': None, 'VN': None, 'VA': None,'CA':None,'ADJ':'3','ADV':None},
            '3': {'S': None, 'AN': None, 'DN': None, 'VN': None, 'VA': None,'CA':None,'ADJ':None,'ADV':None},
            '4': {'S': None, 'AN': None, 'DN': None, 'VN': None, 'VA': None,'CA':None,'ADJ':None,'ADV':None},
            '5': {'S': None, 'AN': None, 'DN': None, 'VN': None, 'VA': None,'CA':None,'ADJ':None,'ADV':None},
            '6': {'S': None, 'AN': None, 'DN': None, 'VN': '13', 'VA': '15','CA':'32','ADJ':None,'ADV':None},
            '7': {'S': None, 'AN': '22', 'DN': '12', 'VN': None, 'VA': None,'CA':None,'ADJ':'9','ADV':'26'},
            '8': {'S': None, 'AN': '11', 'DN': None, 'VN': None, 'VA': None,'CA':None,'ADJ':'9','ADV':None},
            '9': {'S': None, 'AN': None, 'DN': None, 'VN': None, 'VA': None,'CA':None,'ADJ':None,'ADV':None},
            '10': {'S': None, 'AN': None, 'DN': None, 'VN': None, 'VA': None,'CA':None,'ADJ':None,'ADV':None},
            '11': {'S': None, 'AN': None, 'DN': None, 'VN': None, 'VA': None,'CA':None,'ADJ':None,'ADV':None},
            '12': {'S': None, 'AN': None, 'DN': None, 'VN': None, 'VA': None,'CA':None,'ADJ':None,'ADV':None},
            '13': {'S': None, 'AN': None, 'DN': None, 'VN': None, 'VA': None,'CA':None,'ADJ':None,'ADV':'14'},
            '14': {'S': None, 'AN': None, 'DN': None, 'VN': None, 'VA': None,'CA':None,'ADJ':None,'ADV':None},
            '15': {'S': None, 'AN': None, 'DN': None, 'VN': None, 'VA': None,'CA':None,'ADJ':None,'ADV':None},
            '16': {'S': None, 'AN': None, 'DN': None, 'VN': '24', 'VA': '17','CA':'33','ADJ':None,'ADV':None},
            '17': {'S': None, 'AN': None, 'DN': None, 'VN': None, 'VA': None,'CA':None,'ADJ':None,'ADV':'14'},
            '18': {'S': None, 'AN': None, 'DN': None, 'VN': '19', 'VA': '20','CA':'34','ADJ':None,'ADV':None},
            '19': {'S': None, 'AN': None, 'DN': None, 'VN': None, 'VA': None,'CA':None,'ADJ':None,'ADV':'14'},
            '20': {'S': None, 'AN': None, 'DN': None, 'VN': None, 'VA': None,'CA':None,'ADJ':None,'ADV':None},
            '21': {'S': None, 'AN': None, 'DN': None, 'VN': None, 'VA': None,'CA':None,'ADJ':None,'ADV':None},
            '22': {'S': None, 'AN': None, 'DN': None, 'VN': None, 'VA': None,'CA':None,'ADJ':None,'ADV':None},
            '23': {'S': None, 'AN': None, 'DN': None, 'VN': '13', 'VA': None,'CA':None,'ADJ':None,'ADV':None},
            '24': {'S': None, 'AN': None, 'DN': None, 'VN': None, 'VA': None,'CA':None,'ADJ':None,'ADV':'14'},
            '25': {'S': None, 'AN': None, 'DN': None, 'VN': None, 'VA': None,'CA':None,'ADJ':None,'ADV':None},
            '26': {'S': None, 'AN': None, 'DN': None, 'VN': None, 'VA': None,'CA':None,'ADJ':None,'ADV':None},
            '27': {'S': None, 'AN': None, 'DN': None, 'VN': None, 'VA': None,'CA':None,'ADJ':None,'ADV':'26'},
            '28': {'S': None, 'AN': None, 'DN': None, 'VN': None, 'VA': None,'CA':None,'ADJ':None,'ADV':'26'},
            '29': {'S': None, 'AN': None, 'DN': None, 'VN': None, 'VA': None,'CA':None,'ADJ':None,'ADV':None},
            '30': {'S': None, 'AN': None, 'DN': None, 'VN': None, 'VA': None,'CA':None,'ADJ':'31','ADV':None},
            '31': {'S': None, 'AN': None, 'DN': None, 'VN': None, 'VA': None,'CA':None,'ADJ':None,'ADV':None},
            '32': {'S': None, 'AN': None, 'DN': None, 'VN': None, 'VA': None,'CA':None,'ADJ':None,'ADV':None},
            '33': {'S': None, 'AN': None, 'DN': None, 'VN': None, 'VA': None,'CA':None,'ADJ':None,'ADV':None},
            '34': {'S': None, 'AN': None, 'DN': None, 'VN': None, 'VA': None,'CA':None,'ADJ':None,'ADV':None},
            '35': {'S': None, 'AN': None, 'DN': None, 'VN': None, 'VA': None,'CA':None,'ADJ':None,'ADV':None},
            '36': {'S': None, 'AN': None, 'DN': None, 'VN': None, 'VA': None,'CA':None,'ADJ':None,'ADV':None},
            '37': {'S': None, 'AN': None, 'DN': None, 'VN': None, 'VA': None,'CA':None,'ADJ':None,'ADV':None},
        }  # 定义goto
        pass

    # status:目前状态 word:目前输入的单词词性
    def getAction(self, status, word):
        return self.action[status][word]

    # status:目前状态 word:目前输入的单词
    def getGoto(self, status, word):
        return self.goto[status][word]
